﻿//DeltaHedgeStrategy.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Algo.Strategies
{
	using System.Collections.Generic;
	using System.ComponentModel;
	using System.Linq;

	using Ecng.Common;

	using StockSharp.Logging;
	using StockSharp.BusinessEntities;

	/// <summary>
	/// Стратегия дельта хеджирования опционов.
	/// </summary>
	public class DeltaHedgeStrategy : HedgeStrategy
	{
		/// <summary>
		/// Создать <see cref="DeltaHedgeStrategy"/>.
		/// </summary>
		public DeltaHedgeStrategy()
		{
			_positionOffset = new StrategyParam<decimal>(this, "PositionOffset");
		}

		private readonly StrategyParam<decimal> _positionOffset;

		/// <summary>
		/// Сдвиг в позиции по базовому активу, позволяющая не хеджировать часть опционной позиции.
		/// </summary>
		[Category("Хеджирование")]
		[DisplayName("Сдвиг в позиции")]
		[Description("Сдвиг в позиции по базовому активу, позволяющая не хеджировать часть опционной позиции.")]
		public decimal PositionOffset
		{
			get { return _positionOffset.Value; }
			set { _positionOffset.Value = value; }
		}

		/// <summary>
		/// Получить список заявок, рехеджирующих опционную позицию.
		/// </summary>
		/// <returns>Заявки рехеджирования.</returns>
		protected override IEnumerable<Order> GetReHedgeOrders()
		{
			var futurePosition = BlackScholes.Delta();

			var diff = futurePosition.Round() + Position + PositionOffset;

			this.AddInfoLog("Дельта суммарная {0}, Фьючерсная позиция {1}, Направленная позиция {2}, Разница в позиции {3}.",
							futurePosition, Position, PositionOffset, diff);

			if (diff == 0)
				return Enumerable.Empty<Order>();

			var dir = diff > 0 ? OrderDirections.Sell : OrderDirections.Buy;

			return new[]
			{
				new Order
				{
					Direction = dir,
					Volume = diff.Abs(),
					Security = BlackScholes.UnderlyingAsset,
					Portfolio = Portfolio,
					Price = Security.GetCurrentPrice(dir).ApplyOffset(dir, PriceOffset)
				}
			};
		}
	}
}